// 一个模块就是一个对象(小store)

import {
  reqAddShopcart,
  reqChangeAllChecked,
  reqChangeOneChecked,
  reqDeleteChecked,
  reqDeleteOne,
  reqShopcartList,
} from "@/api";

export default {
  state: {
    shopcartList: [],
  },
  mutations: {
    UPDATE_SHOPCARTLIST(state, shopcartList) {
      state.shopcartList = shopcartList;
    },
  },
  actions: {
    // 添加到购物车(可以对购物车已有数量修改的)
    async getAddShopcart({ commit }, { skuId, skuNum }) {
      // 组件中需要获取到请求的成功或者失败状态时 就会这么做!!!

      // async通常写在函数的前面 代表是一个异步函数 当中可以书写一些异步代码
      // async函数的返回值一定是一个promise  而不是你所书写的return值
      // async函数返回的promise是成功的还是失败的 取决于你的return的值

      // return的值分为两大类 一类是非promise值 还有一类是promise值
      // 如果return的是非promise值
      //    那么async函数返回的promise一定是成功的 成功的值就是return的值
      // 如果return的是promise值
      //     return成功promise 那么async函数返回的promise就是成功的 成功的值就是return的promise成功的值
      //     return失败promise 那么async函数返回的promsie就是失败的 失败的原因就是return的promise失败的原因
      // 如果手动在async函数中抛出错误 那么async函数返回的promise就是失败的  失败的原因就是抛出的错误
      const res = await reqAddShopcart(skuId, skuNum);
      if (res.code === 200) {
        //加进去了
        // return Promise.resolve('ok')
        return "ok";
      } else {
        //没加进去
        return Promise.reject("messon");
      }
    },
    // 获取购物车列表
    async getShopcartList({ commit }) {
      const res = await reqShopcartList();
      if (res.code === 200) {
        // 使用可选链 防止咱们使用到的数据是undefiend的可能 undefiend.xxx报错
        commit("UPDATE_SHOPCARTLIST", res.data[0]?.cartInfoList || []);
      }
    },
    // 更改单个选中状态
    async getChangeOneChecked({ commit }, { skuId, isChecked }) {
      const res = await reqChangeOneChecked(skuId, isChecked);
      if (res.code === 200) {
        return "ok";
      } else {
        return Promise.reject("messon");
      }
    },
    // 更改多个选中状态
    async getChangeAllChecked({ commit }, { isChecked, skuIdList }) {
      const res = await reqChangeAllChecked(isChecked, skuIdList);
      if (res.code === 200) {
        return "ok";
      } else {
        return Promise.reject("messon");
      }
    },
    // 删除单个
    async getDeleteOne({ commit }, skuId) {
      const res = await reqDeleteOne(skuId);
      if (res.code === 200) {
        return "ok";
      } else {
        return Promise.reject("messon");
      }
    },
    // 删除选中
    async getDeleteChecked({ commit }, skuIdList) {
      const res = await reqDeleteChecked(skuIdList);
      if (res.code === 200) {
        return "ok";
      } else {
        return Promise.reject("messon");
      }
    },
  },
  getters: {},
};
